#include <iostream>
using namespace std;
 
// 抽象类（基类）
class AbstractClass
{
public:
	// 基本方法——公共方法
	void method1(){
		// do something
	}
	// 基本方法2
	virtual void method2() = 0;
	// 基本方法3——默认实现
	void method3(){
		// do something
	}
	// 模板方法，定义一个算法的框架流程
	void templateMethod(){
		// do something
		method1();
		method2();
		method3();
	}
};
 
// 具体类（派生类)
class ConcreteClass :public AbstractClass
{
public:
	// 实现基本方法2
	void method2(){
		// do something
	}
	// 重定义基本方法3，覆盖基类的方法3
	void method3(){
		// do something
	}
};


// 基类
class FingerprintModule
{
public:
	FingerprintModule(){}
	void getImage(){
		printf("采指纹图像\n");
	}
	void output(){
		printf("指纹图像处理完成!\n");
	}
	virtual bool isSafeMode() = 0;
	virtual void processImage() = 0;
	// 加解密
	virtual void encrypt() = 0;
	virtual void decrypt() = 0;
 
	// 模板方法
	void algorithm(){
		// 1.采图
		getImage();
		// 2.安全模式下加密和解密
		if (isSafeMode()){
			// 2.1. 加密
			encrypt();
			// 2.2. 解密
			decrypt();
		}
		// 3.处理Image
		processImage();
		// 4.处理结果
		output();
	}
};

// 派生类
class FingerprintModuleA :public FingerprintModule
{
public:
	FingerprintModuleA(){}
	void processImage(){
		printf("使用 第一代版本算法 处理指纹图像\n");
	}
	bool isSafeMode(){
		printf("安全模式\n");
		return true;
	}
	void encrypt(){
		printf("使用RSA密钥加密\n");
	}
	void decrypt(){
		printf("使用RSA密钥解密\n");
	}
};
 
// 派生类
class FingerprintModuleB :public FingerprintModule
{
public:
	FingerprintModuleB(){}
	void processImage(){
		printf("使用 第二代版本算法 处理指纹图像\n");
	}
	bool isSafeMode(){
		printf("非安全模式\n");
		return false;
	}
	void encrypt(){}
	void decrypt(){}
};
 
// 派生类
class FingerprintModuleC :public FingerprintModule
{
public:
	FingerprintModuleC(){}
	void processImage(){
		printf("使用 第一代版本算法 处理指纹图像\n");
	}
	bool isSafeMode(){
		printf("安全模式\n");
		return true;
	}
	void encrypt(){
		printf("使用DH密钥加密\n");
	}
	void decrypt(){
		printf("使用DH密钥解密\n");
	}
};

 
int main()
{
	FingerprintModule *fp = new FingerprintModuleA();
	fp->algorithm();
 
	fp = new FingerprintModuleB();
	fp->algorithm();
 
	fp = new FingerprintModuleC();
	fp->algorithm();
 
 
	printf("\n\n");
	system("pause");
	return 0;
}




